import re
import time
from _pydatetime import datetime
from concurrent.futures import ThreadPoolExecutor
import pandas as pd
from openai import OpenAI

# 初始化 OpenAI 客户端
client = OpenAI(
    api_key="",  #通义千问-Plus-2024-12-20 文本输生成- API-KEY
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 请确认这是正确的URL
)


# 读取 Excel 文件
def read_excel(file_path):
    return pd.read_excel(file_path)


# 查询手机设备的上市时间和停售时间
def get_phone_release_info(phone_name, url=None):  # url 参数不再需要，因为我们使用了OpenAI客户端
    # 睡眠 1 秒    官方限制每分钟调用次数（QPM）：60
    # time.sleep(1)
    try:
        completion = client.chat.completions.create(
            model="qwen-turbo-latest",  # 模型名称，请根据官方文档选择合适的模型
            messages=[
                {'role': 'system', 'content': 'You are a helpful assistant.'},
                {'role': 'user', 'content': f"查询 {phone_name} 的上市时间和停售时间"},
            ]
        )
        response_text = completion.choices[0].message.content.strip()
        return response_text if response_text else "未找到相关信息"
    except Exception as e:
        return f"Error: {str(e)}"


# 将查询结果写回 Excel 文件
def write_to_excel(df, output_file):
    df.to_excel(output_file, index=False)

# 主函数
def main(input_file, output_file):
    df = read_excel(input_file)

    if '设备型号' not in df.columns:
        print("Excel 文件没有 '设备型号' 列")
        return

    launch_dates = []
    end_dates = []

    # 使用线程池并行处理
    with ThreadPoolExecutor(max_workers=5) as executor:
        results = list(executor.map(get_phone_release_info, df['设备型号']))

    for release_info in results:
        launch_date, end_date = extract_dates(release_info)
        launch_dates.append(launch_date)
        end_dates.append(end_date)

    df['上市时间'] = launch_dates
    df['停售时间'] = end_dates

    write_to_excel(df, output_file)
    print(f"结果已写入 {output_file}")


# 提取上市时间和停售时间
def extract_dates(info):
    # 获取当前时间
    current_date = datetime.now()

    # 正则表达式匹配 yyyy、yyyy-mm、yyyy-mm-dd 或 yyyy年、yyyy年mm月、yyyy年mm月dd日 格式的日期
    date_pattern = r"(\d{4}(?:[-年/]\d{1,2})?(?:[-月/]\d{1,2})?)"
    dates = re.findall(date_pattern, info)

    # 转换为统一格式 yyyy年mm月dd日
    processed_dates = []
    for date in dates:
        # 替换字符并去掉 '日'
        date = re.sub(r'[年/月]', '-', date).replace('日', '')  # 替换中文字符为标准格式

        # 直接使用匹配到的日期
        try:
            # 尝试将日期转换为 datetime 对象
            if '-' in date:
                # 根据匹配到的格式进行转换
                if date.count('-') == 2:
                    processed_date = datetime.strptime(date, "%Y-%m-%d")
                elif date.count('-') == 1:
                    processed_date = datetime.strptime(date, "%Y-%m")
                else:
                    processed_date = datetime.strptime(date, "%Y")
            else:
                processed_date = datetime.strptime(date, "%Y")

            # 将 datetime 对象转换回字符串格式
            date = processed_date.strftime("%Y年%m月%d日").replace('01月01日', '').replace('01日', '')
        except ValueError:
            # 如果日期无法转换为 datetime 对象，则忽略这个日期
            date = None

        processed_dates.append(date)

    # 返回上市时间和停售时间
    return processed_dates[0] if len(processed_dates) > 0 else None, \
        processed_dates[1] if len(processed_dates) > 1 else None


# 示例：输入文件路径和输出文件路径
input_file = 'D:\\workNote\\钉钉\\设备型号副本.xlsx'  # 这里填上你的输入文件路径
output_file = '设备查询结果.xlsx'  # 输出的结果文件

# 调用主函数
main(input_file, output_file)
